// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.SQLUtils;
// import com.alibaba.druid.sql.ast.SQLDataType;
// import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
// import com.alibaba.druid.sql.ast.SQLExprImpl;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;
// import com.alibaba.druid.util.MySqlUtils;

// import java.text.ParseException;
// import java.text.SimpleDateFormat;
// import java.util.*;
#pragma once
#include <string>
// #include <boost/date_time/posix_time/posix_time.hpp>
// #include <boost/date_time/local_time/local_time.hpp>
// #include <boost/date_time/gregorian/greg_month.hpp>
#include <chrono>  
#include "../SQLExprImpl.h"
#include "SQLValuableExpr.h"
#include "SQLLiteralExpr.h"

class SQLDataType;
class SQLASTVisitor;

class SQLTimestampExpr : virtual public SQLExprImpl, virtual public SQLValuableExpr, virtual public SQLLiteralExpr
{
public:
  static SQLDataType_ptr DATA_TYPE;

  string_ptr  literal;
  string_ptr  timeZone;
  BOOL_ptr withTimeZone;

  SQLTimestampExpr();

  SQLTimestampExpr(string_ptr  literal);

  SQLTimestampExpr(std::chrono::system_clock::time_point date);

  SQLTimestampExpr(std::chrono::system_clock::time_point date, string_ptr  timeZone);
  SHAREDOBJECT(SQLTimestampExpr) ;
  virtual SQLObject_ptr clone();

  std::shared_ptr<std::chrono::system_clock::time_point> getDate(string_ptr  timeZone);

  BOOL_ptr addDay(int delta);

  BOOL_ptr addMonth(int delta);

  BOOL_ptr addHour(int delta);

  BOOL_ptr addMiniute(int delta);

  string_ptr  getValue();

  string_ptr  getLiteral();

  void setLiteral(string_ptr  literal);

  void setLiteral(std::chrono::system_clock::time_point x);

  void setLiteral(std::chrono::system_clock::time_point x, string_ptr  timeZone);

  string_ptr  getTimeZone();

  void setTimeZone(string_ptr  timeZone);

  BOOL_ptr isWithTimeZone();

  void setWithTimeZone(BOOL_ptr withTimeZone);

  //@Override
  int hashCode();

  //@Override
  bool equals(Object_ptr obj);

  //@Override
  void accept0(SQLASTVisitor_ptr visitor);

  string_ptr  toString();

  SQLDataType_ptr computeDataType();

  //@Override
  SQLObject_list_ptr  getChildren();

  static BOOL_ptr check(string_ptr  str);

  static std::shared_ptr<SQLTimestampExpr> of(string_ptr  str);
};
